package playing;

import java.io.*;
import java.awt.*;

import objets.Cell;


/** Cree un nouveau ennemi pour le garcon.
 * @author Cecile FRANCOU
 * @author Sophia GALLARDO
 * @version 1.1.6 
 */

/** Cette classe cree une bete qui est un ennemi du garcon.
 * Des que la bete touche le garcon, le garcon atteri n'importe ou dans le labyrinthe
 * dans une case non occupee. (comme quand la fille donne un coup de poing au garcon)
 */

public class Bete extends Personnage implements Runnable{
    
    /** direction de la bete */
    private int direction;
    
    /** le thread du chien */
    private Thread thread;

    
    /** Genere un joueur avec une "bete" a une certaine position dans le labyrinthe.
     * @param position_origine position d'origine du joueur
     * @param interaction interaction entre les joueurs et le labyrinthe.
     */
    public Bete(Cell position_origine, Interaction interaction){
        super(position_origine,interaction);
	chemin_images = "images" + File.separatorChar+"traditionnel"+File.separatorChar;
        
        // on initialise le thread
        thread = new Thread(this);
	
        }

  



    /** Retourne le thread de la "bete".
     * @return Thread thread du joueur.
     */
    public Thread getThread(){
        return thread;
    }

  

    
    /** On demarre le thread de la "bete".
     */
    public void demarrer(){
        thread.start();
    }    
    
    /** Methode qui s'execute continuellement uniquement si le thread du
     * joueur est actif.
     * On endort le thread de la "bete" toutes les 250ms.
     */
    public void run(){
        while (!interaction.partie_finie()){ // tant que la partie n'est pas finit
            avance(getDirection()); // la "bete" avance
		
            try{
                Thread.sleep(250); // on "endort" la "bete" pendant 250ms
            }
            catch(Exception e) {
                e.printStackTrace();
            }	
        }
        
    }

    /** Change la direction de la "bete" : haut, bas, gauche ou droite. */
    public void changeDirection(){
	direction = (int) Math.floor(Math.random()*4);
    }
	
    /** Renvoie la direction de la "bete".
     * @return <code> 0 </code> gauche <BR> <code> 1 </code> droite <BR> <code> 2 </code> haut <BR> <code> 3 </code> bas
     */
    public int getDirection(){
	return direction;
    }
    
    /** Fait avancer la "bete" dans la meme direction tant qu'elle n'arrive pas sur un mur
     * si elle arrive contre un mur, elle change de direction jusqu'a quelle en recontre un nouveau
     * et ainsi de suite.
     * @param direction direction : droite, gauche, haut et bas.
     */
    public void avance(int direction){
        // regarder qu'il n'y a pas de mur
        switch (direction){
            /* on verifie qu'il n'y a pas de mur et si il n'y a pas de mur,
               on modifie la position de la "bete", sinon on change la direction
               de son deplacement
            */
        case 0 : // va a gauche
            if (!interaction.choc_mur(getX() - 1 , getY())){
                setPosition(new Cell(getX()-1,getY()));  
            }
            else 
                changeDirection(); 
            break;
        case 1: //  va a droite
            if (!interaction.choc_mur(getX() + 1 , getY())){
                setPosition(new Cell(getX()+1,getY())); 
		
            }
            else 
                changeDirection(); 
            break;
        case 2: //  monte
            if (!interaction.choc_mur(getX() , getY() - 1)){
                setPosition(new Cell(getX(),getY()-1));
            }
            else 
                changeDirection(); 
            break;
        case 3: //  descend
            if (!interaction.choc_mur(getX() , getY() + 1)){ 
                setPosition(new Cell(getX(), getY()+1)); 
            }
            else changeDirection(); 
            break;
        }// fin du switch
        
        
    }
 
    

    
    
    
   
        

    /** Dessine la "bete" dans le labyrinthe.
     * @param g graphique.
     */
    public void dessineToi(Graphics g){
        
	Toolkit toolkit_chemin = interaction.getToolkit();
        Image image_chien = toolkit_chemin.getImage(chemin_images+"dog.gif");
        g.drawImage(image_chien,getX()*interaction.getLongueurcase(),getY()*interaction.getHauteurcase(),interaction.getLongueurcase(),interaction.getHauteurcase(),interaction); 
  
               
  }
 
}// fin classe

